第4章 OpenID Connect
OpenID Connectとは何か
意義
OIDCによってIDプロバイダが提供するアカウントでサードパーティアプリにログインすることができる。
アプリ、ユーザー共に余計なアカウントID・パスワードを管理する必要がない。
IDプロバイダが提供する属性情報を利用して新規登録時のプロフィール情報の入力、メールアドレスの到達確認を省略できる。
仕組み
OAuthにIDトークンとUserInfoエンドポイントを加えたものでOAuthの拡張である。
OAuthとOIDCの違い
関連用語が違う。
table:関連用語
OAuth OIDC
リソースオーナー エンドユーザー
クライアント リライング・パーティ
認可サーバー IDプロバイダ
リソースサーバー UserInfoエンド
グラントタイプ フロー
フロー
table:フロー
OAuth ODIC
認可コードグラント 認可コードフロー
インプリシットグラント インプリシットフロー
クライアントクレデンシャルグラント -
リソースオーナーパスワードクレデンシャルグラント -
ハイブリッドフロー ハイブリッドフロー
スコープ
table:スコープ
値 取得できる情報
openid OIDCのリクエストであることを表す
profile 名前、誕生日、性別、写真などのプロフィール情報へのアクセス
email email及びemail_verifiedへのアクセス
address addressへのアクセス
phone phone_number及びphone_number_verifiedへのアクセス
IDトークン
IDトークンとは
IDトークンを使うのはリライング・パーティはエンドユーザーを認証するのに使う。
IDトークンを発行するのはIDプロバイダ。
取得するタイミングは認可コードフロー、インプリシットフローともにアクセストークンを取得するタイミング。
IDトークンの形式はJWT。
JWT
iss
ISSuerでIDトークンの発行者。
aud
AUDienceでIDトークンの発行を受けるリライング・パーティのクライアントID。
sub
SUBjectでエンドユーザーの識別子。リライング・パーティはこの値でエンドユーザーを識別する。
iat
Issued ATでTUTC 1970-01-01T0:0:0Zからの発行時間の秒数を表す。
exp
EXPirationでIDトークンの有効期限を秒数の表す。
nonce
リプレイアタック防止のために用いられるランダムな文字列で、認証リクエストに含まれるnonceと同じ値がIDトークンに含まれる。
UserInfoエンドポイント
エンドユーザーのプロフィール情報をリライング・パーティに与えるためにエンドポイント。
認証以外の目的でユーザー情報を利用する際に利用する。
フロー
認可コードフロー
アクセストークンがブラウザを介さずに直接クライアントとIDプロバイダ間で受け渡されるため、流出のリスクが低い。
登場するロール間でのやりとりで正しい相手であることの確認が行われる。
IDプロバイダーはID・パスワードの入力などの方法によってエンドユーザーの認証を行う。
IDプロバイダーはHTTP Basic認証によってアクセス元のクライアントID、クライアントシークレットを確認する。
クライアントはURIとSSL証明書によってアクセス先のIDプロバイダーのアイデンティティを確認する。
リフレッシュトークンの有効期限が切れた後に再度、エンドユーザーの認証を行わなくても新しいアクセストークンを取得することが可能になる。
アクセストークンリクエスト
パラメータ
grant_type
値にauthorization_codeを指定する。
code
redirect_uri
client_id
リライング・パーティの登録時に発行されたクライアントIDの値を指定する。
client_secret
リライング・パーティの登録時に発行されたクライアントシークレットの値を指定する。
アクセストークンレスポンス
パラメータ
access_token
token_type
"Bearer"と言う文字列が入っている。
expires_in
アクセストークンの有効期限が秒単位で指定されている。
refresh_token
任意なので必ず入っているとは限らない。
id_token
トークンの検証
subをエンドエンドユーザーの識別子として利用する。
issが利用するIDプロバイダのURLであることを確認。
audに自分のクライアントIDが入っていることを確認。
expが過ぎていないことを確認。
iat許容できる範囲であることを確認。
認証リクエストに含めたnonceの値とIDトークンに含まれるnonceの値が一致することを確認。
IDプロバイダが提供する公開鍵を利用して署名を検証する。
インプリシットフロー
JavaScriptアプリやスマホアプリなどのクライアントID・クライアントシークレットを安全に保持的ない、パブリッククライアント向けのフロー。
クライアント認証がIDプロバイダによって行われない。
リライング・パーティはクライアントIDとクライアントシークレットを安全に保存できないので
リクエストにクライアントシークレットが含まれないため、代わりに事前とろくしたリダイレクトURIにIDトークン・アクセストークンを渡すことで、正しいリライング・パーティへの受け渡しを担保する。
一度のリクエストでアクセストークンの発行が行われる。
リフレッシュトークンの発行が禁止されている。
アクセストークンリクエスト
パラメータ
response_type
idtoken_tokenを設定している。
clint_id
state
リライング・パーティが生成したランダムな値を設定する。
scope
redirect_uri
nonce
アクセストークンレスポンス
パラメータ
access_token
token_type
expires_in
state
id_token